package org.example.servlet;

import org.example.entity.User;
import org.example.service.UserService;
import org.example.service.impl.UserServiceImpl;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

// 使用模糊路由地址, 好处是
// 所有以/user开头的请求地址都被此servlet处理
@WebServlet(urlPatterns = "/user/*")
public class UserServlet extends BaseServlet{
    UserService userService;
    public UserServlet() {
        // 因为Servlet默认为单例, 因此组合的Service + Dao都为单例
        this.userService = new UserServiceImpl();
    }
    @Override
    protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException, SQLException {
        String requestURI = req.getRequestURI();
        // 用switch进行再次路由
        switch (requestURI) {
            case "/user/login":
                login(req, resp);
                break;
            default:
                // 自己写一个default, 以上所有case中的地址都匹配不上, 我们自己手动返回404
                resp.sendError(HttpServletResponse.SC_NOT_FOUND, "资源未找到");
                break;
        }
    }

    private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException, SQLException {
        User user = new User();
        user.setAccount(req.getParameter("account"));
        user.setPassword(req.getParameter("password"));
        // 传过去的user中只包含http的请求参数: 账号+密码
        // 返回的user对象中包含数据库的一行完整数据
        // 此行代码内部有可能抛出各种业务异常, 我们不用管, 父类帮我捕捉了!
        user = userService.login(user);
        // 这一步如果抛出异常, 直接进父类的catch, 这里不再向下执行
        // 如果能继续向下执行, 说明没有抛出异常
        // 取出当前用户的session对象
        HttpSession session = req.getSession();
        // session.setMaxInactiveInterval(20);
        // 把用户对象存储到session中,用于登录状态校验,并用于获取当前用户信息
        session.setAttribute("user", user);
        // 复用父类的success方法响应成功, 并把user对象给前端返回过去
        Map map = new HashMap();
        map.put("username", user.getUsername());
        map.put("role", user.getRole());
        success(resp, map);
    }
}
